package com.shlh.saas.service.linkedin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shlh.saas.entity.linkedin.LinkedInUserEs;
import com.shlh.saas.model.dto.LinkedInQueryDTO;

import java.util.List;
import java.util.Map;

/**
 * LinkedIn Elasticsearch服务接口
 * 提供ES查询和两阶段查询功能
 */
public interface LinkedInEsService {

    /**
     * 分页查询LinkedIn用户列表
     *
     * @param linkedInUserEs 查询条件
     * @return 分页结果
     */
    Page<LinkedInUserEs> queryLinkedInUserList(LinkedInUserEs linkedInUserEs, Integer page, Integer size);

    /**
     * 统计LinkedIn用户数量
     *
     * @param linkedInUserEs 查询条件
     * @return 符合条件的记录数
     */
    long countLinkedInUsers(LinkedInUserEs linkedInUserEs);

    /**
     * 获取LinkedIn用户筛选选项列表
     *
     * @param linkedInUserEs 查询条件
     * @return 筛选选项映射
     */
    Map<String, List<String>> queryLinkedInUserMapList(LinkedInUserEs linkedInUserEs);

    // ==================== 两阶段查询方法 ====================

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据公司名称和职位在ES中查找匹配记录的标识信息
     *
     * @param companyName 公司名称
     * @param jobTitle 职位标题
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByCompanyAndJob(String companyName, String jobTitle, int limit);

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据姓名和公司在ES中查找匹配记录的标识信息
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param companyName 公司名称
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByNameAndCompany(String firstName, String lastName, String companyName, int limit);

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据姓名和邮箱在ES中查找匹配记录的标识信息
     *
     * @param firstName 名字
     * @param lastName 姓氏
     * @param email 邮箱
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByNameAndEmail(String firstName, String lastName, String email, int limit);

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据手机号和姓名在ES中查找匹配记录的标识信息
     *
     * @param phoneNumber 手机号
     * @param firstName 名字
     * @param lastName 姓氏
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByPhoneAndName(String phoneNumber, String firstName, String lastName, int limit);

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据邮箱精确匹配在ES中查找匹配记录的标识信息
     *
     * @param email 邮箱
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByEmail(String email, int limit, int offset);

    List<Map<String, String>> searchByPhone(String value, int size, int offset);

    /**
     * 两阶段查询第一阶段：ES快速检索
     * 根据LinkedIn URL在ES中查找匹配记录的标识信息
     *
     * @param linkedinUrl LinkedIn个人资料链接
     * @param limit 最大返回数量，默认50
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByLinkedInUrl(String linkedinUrl, int limit);

    // ==================== 导出功能两阶段查询方法 ====================

    /**
     * 两阶段查询第一阶段：ES导出查询
     * 根据查询条件在ES中查找匹配记录的标识信息（用于导出）
     *
     * @param queryDTO 查询参数
     * @param limit 最大返回数量
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchForExport(LinkedInQueryDTO queryDTO, int limit);

    /**
     * 两阶段查询第一阶段：ES分页导出查询
     * 支持大数据量的分页导出，避免内存溢出
     *
     * @param queryDTO 查询参数
     * @param from 起始位置
     * @param size 每页大小
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchForExportWithPagination(LinkedInQueryDTO queryDTO, int from, int size);

    // ==================== 关键词搜索方法 ====================

    /**
     * 关键词搜索（支持筛选条件）
     *
     * @param keyword 搜索关键词
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param location 位置筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @param from 起始位置
     * @param size 每页大小
     * @return 分页结果
     */
    Page<LinkedInUserEs> searchWithFilters(String keyword, String companyName, String jobTitle, 
                                          String industry, String location, String contactMethod, 
                                          String companySize, int from, int size);

    /**
     * 关键词搜索计数（支持筛选条件）
     *
     * @param keyword 搜索关键词
     * @param companyName 公司名称筛选
     * @param jobTitle 职位筛选
     * @param industry 行业筛选
     * @param location 位置筛选
     * @param contactMethod 联系方式筛选
     * @param companySize 公司规模筛选
     * @return 符合条件的记录数
     */
    long countWithFilters(String keyword, String companyName, String jobTitle, 
                         String industry, String location, String contactMethod, 
                         String companySize);

    /**
     * 获取搜索建议
     *
     * @param keyword 关键词
     * @param field 搜索字段
     * @param limit 最大返回数量
     * @return 搜索建议列表
     */
    List<String> getSuggestions(String keyword, String field, int limit);

    // ==================== 聚合查询方法 ====================

    /**
     * 获取行业分布统计
     *
     * @param queryCondition 查询条件
     * @return 行业分布映射
     */
    Map<String, Long> getIndustryDistribution(LinkedInUserEs queryCondition);

    /**
     * 获取地理位置分布统计
     *
     * @param queryCondition 查询条件
     * @return 地理位置分布映射
     */
    Map<String, Long> getLocationDistribution(LinkedInUserEs queryCondition);

    /**
     * 获取公司规模分布统计
     *
     * @param queryCondition 查询条件
     * @return 公司规模分布映射
     */
    Map<String, Long> getCompanySizeDistribution(LinkedInUserEs queryCondition);

    List<LinkedInUserEs> searchLinkedInUsersWithEmail(String searchKeyword, int offset, int size);

    Long countLinkedInUsersWithEmail(String searchKeyword);

    List<LinkedInUserEs> searchLinkedInUsersWithPhone(String searchKeyword, int offset, int size);

    Long countLinkedInUsersWithPhone(String searchKeyword);


    List<Map<String, String>> findByDomain(String domain, int size, int offset);

    List<Map<String, String>> findByKeyword(String keyword, int size, int offset);

    List<Map<String, String>> searchLinkedInByNameOrUrl(String keyword, int size, int offset);

    long countLinkedInUsersByKeyword(LinkedInUserEs linkedInUserEs);
    
    /**
     * 根据领英链接和姓名查询标识信息
     * @param linkedinUrl 领英链接
     * @param name 姓名
     * @param limit 限制数量
     * @param offset 偏移量
     * @return 包含mysqlTable和id的轻量级结果列表
     */
    List<Map<String, String>> searchByLinkedInUrlAndName(String linkedinUrl, String name, int limit, int offset);

    List<String> searchCompanies(String company);

    List<String> searchJobTitles(String jobTitles);

    List<String> searchIndustries(String industry);

    List<String> searchLocations(String location);

    List<LinkedInUserEs> searchLinkedInDataByPhone(String companyName, String fullName, String website);

    List<LinkedInUserEs> searchLinkedInDataByEmail(String companyName, String fullName, String website);

}
